package com.allm.ai.common.factory.impl;

import org.springframework.ai.chat.model.ChatModel;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.stereotype.Component;

import com.alibaba.cloud.ai.dashscope.api.DashScopeApi;
import com.alibaba.cloud.ai.dashscope.chat.DashScopeChatModel;
import com.alibaba.cloud.ai.dashscope.chat.DashScopeChatOptions;
import com.alibaba.cloud.ai.dashscope.chat.DashScopeChatOptions.DashscopeChatOptionsBuilder;
import com.allm.ai.common.entity.AiModel;
import com.allm.ai.common.factory.ChatModelCreator;

import lombok.extern.slf4j.Slf4j;

/**
 * Qwen3 ChatModel 创建器
 * 根据数据库中的 AiModel 配置自动创建 ChatModel
 * 使用 spring-ai-alibaba-starter-dashscope 提供的 DashScope API
 */
@Slf4j
@Component
@ConditionalOnClass({DashScopeApi.class, DashScopeChatModel.class})
public class QwenChatModelCreator implements ChatModelCreator {
    
    @Override
    public String getServiceProvider() {
        return "Alibaba";
    }
    
    @Override
    public ChatModel createChatModel(AiModel aiModel) throws Exception {
        log.info("创建 Qwen3 ChatModel: {}", aiModel.getRequestModelName());
        
        if (!validateConfig(aiModel)) {
            throw new IllegalArgumentException("Qwen3 模型配置无效: " + aiModel.getRequestModelName());
        }
        
        try {
            // 根据 AiModel 配置创建 ChatModel
            return createQwenModel(aiModel);
        } catch (Exception e) {
            log.error("创建 Qwen3 ChatModel 失败: {}", aiModel.getRequestModelName(), e);
            throw new RuntimeException("创建 Qwen3 ChatModel 失败: " + e.getMessage(), e);
        }
    }
    
    /**
     * 根据 AiModel 配置创建 Qwen3 ChatModel
     */
    private ChatModel createQwenModel(AiModel aiModel) throws Exception {
        // 1. 创建 DashScope API 客户端
        DashScopeApi dashScopeApi = createDashScopeApi(aiModel);
        
        // 2. 根据 AiModel 配置构建选项
        DashScopeChatOptions options = createQwen3Options(aiModel);
        
        // 3. 创建 DashScopeChatModel 实例（使用Builder模式）
        return DashScopeChatModel.builder()
                .dashScopeApi(dashScopeApi)
                .defaultOptions(options)
                .build();
    }
    
    /**
     * 创建 DashScope API 客户端
     */
    private DashScopeApi createDashScopeApi(AiModel aiModel) {
        String apiKey = aiModel.getApiKey();
        
        if (apiKey == null || apiKey.trim().isEmpty()) {
            throw new RuntimeException("Qwen3 API Key 未配置");
        }
        
        log.info("创建 DashScope API 客户端");
        
        // 创建 DashScopeApi 实例
        return DashScopeApi.builder()
            .baseUrl(aiModel.getApiEndpoint())
            .apiKey(aiModel.getApiKey()).build();
    }
    
    /**
     * 创建 Qwen3 选项
     */
    private DashScopeChatOptions createQwen3Options(AiModel aiModel) {
        DashscopeChatOptionsBuilder optionsBuilder = DashScopeChatOptions.builder()
                .withModel(aiModel.getRequestModelName());
        
        // 设置温度参数
        if (aiModel.getTemperature() != null) {
            optionsBuilder.withTemperature(aiModel.getTemperature().doubleValue());
        }

        // 设置最大令牌数
        if (aiModel.getMaxTokens() != null) {
            optionsBuilder.withMaxToken(aiModel.getMaxTokens());
        }

        // 关键：为推理模型添加特殊配置
        if (isReasoningModel(aiModel)) {
            log.info("检测到Qwen3推理模型，启用思考过程输出: {}", aiModel.getRequestModelName());
            // 推理模型特殊配置
            optionsBuilder.withEnableThinking(true)
                .withTemperature(aiModel.getTemperature().doubleValue())  // 低温度确保稳定的推理
                .withMaxToken(aiModel.getMaxTokens())   // 足够的令牌数容纳思考过程
                .withTopP(0.9d);       // 设置top_p参数
        }
        
        return optionsBuilder.build();
    }
    
    @Override
    public boolean supportsStreaming() {
        return true;
    }
    
    @Override
    public boolean validateConfig(AiModel aiModel) {
        boolean baseValid = ChatModelCreator.super.validateConfig(aiModel);
        if (!baseValid) {
            return false;
        }
        
        // Qwen3 特定验证
        String endpoint = aiModel.getApiEndpoint();
        if (endpoint != null) {
            // 验证端点格式
            if (!endpoint.contains("dashscope") && !endpoint.contains("alibaba")) {
                log.warn("Qwen3 端点格式可能不正确，建议使用 DashScope 端点: {}", endpoint);
            }
        }
        
        // 验证模型名称
        String modelName = aiModel.getRequestModelName();
        if (modelName != null) {
            // 检查常见的 Qwen3 模型名称格式
            if (!isValidQwen3ModelName(modelName)) {
                log.warn("Qwen3 模型名称可能不正确: {}", modelName);
            }
        }
        
        return true;
    }
    
    /**
     * 验证 Qwen3 模型名称格式
     */
    private boolean isValidQwen3ModelName(String modelName) {
        String lowerName = modelName.toLowerCase();
        
        // 常见的 Qwen3 模型名称模式
        return lowerName.startsWith("qwen");
    }
}
